<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Double Factorial</title>
<link rel="stylesheet" href="../../math.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../../index.html" title="Math Toolkit 4.2.1">
<link rel="up" href="../factorials.html" title="Factorials and Binomial Coefficients">
<link rel="prev" href="sf_factorial.html" title="Factorial">
<link rel="next" href="sf_rising_factorial.html" title="Rising Factorial">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
<td align="center"><a href="../../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="sf_factorial.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../factorials.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="sf_rising_factorial.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="math_toolkit.factorials.sf_double_factorial"></a><a class="link" href="sf_double_factorial.html" title="Double Factorial">Double Factorial</a>
</h3></div></div></div>
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">math</span><span class="special">/</span><span class="identifier">special_functions</span><span class="special">/</span><span class="identifier">factorials</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
</pre>
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">math</span><span class="special">{</span>

<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="identifier">T</span> <span class="identifier">double_factorial</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">i</span><span class="special">);</span>

<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="../../policy.html" title="Chapter 22. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&gt;</span>
<span class="identifier">T</span> <span class="identifier">double_factorial</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">i</span><span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../../policy.html" title="Chapter 22. Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&amp;);</span>

<span class="special">}}</span> <span class="comment">// namespaces</span>
</pre>
<p>
        Returns <code class="literal">i!!</code>.
      </p>
<p>
        The final <a class="link" href="../../policy.html" title="Chapter 22. Policies: Controlling Precision, Error Handling etc">Policy</a> argument is optional and can
        be used to control the behaviour of the function: how it handles errors,
        what level of precision to use etc. Refer to the <a class="link" href="../../policy.html" title="Chapter 22. Policies: Controlling Precision, Error Handling etc">policy
        documentation for more details</a>.
      </p>
<p>
        May return the result of <a class="link" href="../error_handling.html#math_toolkit.error_handling.overflow_error">overflow_error</a>
        if the result is too large to represent in type T. The implementation is
        designed to be optimised for small <span class="emphasis"><em>i</em></span> where table lookup
        of i! is possible.
      </p>
<div class="important"><table border="0" summary="Important">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../../doc/src/images/important.png"></td>
<th align="left">Important</th>
</tr>
<tr><td align="left" valign="top">
<p>
          The functions described above are templates where the template argument
          T can not be deduced from the arguments passed to the function. Therefore
          if you write something like:
        </p>
<p>
          <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">double_factorial</span><span class="special">(</span><span class="number">2</span><span class="special">);</span></code>
        </p>
<p>
          You will get a (possibly perplexing) compiler error, usually indicating
          that there is no such function to be found. Instead you need to specify
          the return type explicitly and write:
        </p>
<p>
          <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">double_factorial</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;(</span><span class="number">2</span><span class="special">);</span></code>
        </p>
<p>
          So that the return type is known. Further, the template argument must be
          a real-valued type such as <code class="computeroutput"><span class="keyword">float</span></code>
          or <code class="computeroutput"><span class="keyword">double</span></code> and not an integer
          type - that would overflow far too easily!
        </p>
<p>
          The source code <code class="computeroutput"><span class="keyword">static_assert</span></code>
          and comment just after the will be:
        </p>
<pre class="programlisting"><span class="keyword">static_assert</span><span class="special">(!</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">is_integral</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">,</span> <span class="string">"Type T must not be an integral type"</span><span class="special">);</span>
<span class="comment">// factorial&lt;unsigned int&gt;(n) is not implemented</span>
<span class="comment">// because it would overflow integral type T for too small n</span>
<span class="comment">// to be useful. Use instead a floating-point type,</span>
<span class="comment">// and convert to an unsigned type if essential, for example:</span>
<span class="comment">// unsigned int nfac = static_cast&lt;unsigned int&gt;(factorial&lt;double&gt;(n));</span>
<span class="comment">// See factorial documentation for more detail.</span>
</pre>
</td></tr>
</table></div>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>
          The argument to <code class="computeroutput"><span class="identifier">double_factorial</span></code>
          is type <code class="computeroutput"><span class="keyword">unsigned</span></code> even though
          technically -1!! is defined.
        </p></td></tr>
</table></div>
<h5>
<a name="math_toolkit.factorials.sf_double_factorial.h0"></a>
        <span class="phrase"><a name="math_toolkit.factorials.sf_double_factorial.accuracy"></a></span><a class="link" href="sf_double_factorial.html#math_toolkit.factorials.sf_double_factorial.accuracy">Accuracy</a>
      </h5>
<p>
        The implementation uses a trivial adaptation of the factorial function, so
        error rates should be no more than a couple of epsilon higher.
      </p>
<h5>
<a name="math_toolkit.factorials.sf_double_factorial.h1"></a>
        <span class="phrase"><a name="math_toolkit.factorials.sf_double_factorial.testing"></a></span><a class="link" href="sf_double_factorial.html#math_toolkit.factorials.sf_double_factorial.testing">Testing</a>
      </h5>
<p>
        The spot tests for the double factorial use data generated by <a href="http://www.wolframalpha.com/" target="_top">Wolfram
        Alpha</a>.
      </p>
<h5>
<a name="math_toolkit.factorials.sf_double_factorial.h2"></a>
        <span class="phrase"><a name="math_toolkit.factorials.sf_double_factorial.implementation"></a></span><a class="link" href="sf_double_factorial.html#math_toolkit.factorials.sf_double_factorial.implementation">Implementation</a>
      </h5>
<p>
        The double factorial is implemented in terms of the factorial and gamma functions
        using the relations:
      </p>
<div class="blockquote"><blockquote class="blockquote"><p>
          <span class="serif_italic"><span class="emphasis"><em>(2n)!! = 2<sup>n </sup> * n!</em></span></span>
        </p></blockquote></div>
<div class="blockquote"><blockquote class="blockquote"><p>
          <span class="serif_italic"><span class="emphasis"><em>(2n+1)!! = (2n+1)! / (2<sup>n </sup> n!)</em></span></span>
        </p></blockquote></div>
<p>
        and
      </p>
<div class="blockquote"><blockquote class="blockquote"><p>
          <span class="serif_italic"><span class="emphasis"><em>(2n-1)!! = Γ((2n+1)/2) * 2<sup>n </sup> / sqrt(pi)</em></span></span>
        </p></blockquote></div>
</div>
<div class="copyright-footer">Copyright © 2006-2021 Nikhar Agrawal, Anton Bikineev, Matthew Borland,
      Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert Holin, Bruno
      Lalande, John Maddock, Evan Miller, Jeremy Murphy, Matthew Pulver, Johan Råde,
      Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg, Daryle
      Walker and Xiaogang Zhang<p>
        Distributed under the Boost Software License, Version 1.0. (See accompanying
        file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
      </p>
</div>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="sf_factorial.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../factorials.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="sf_rising_factorial.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>
